import tkinter as tk
import ttkbootstrap as ttkb
from ttkbootstrap.constants import *
import tkinter.messagebox as messagebox
from PIL import Image, ImageTk
import os
from utils import resource_path, log_info, log_error, log_debug

class CustomMessageBox:
    @staticmethod
    def showinfo(title, message, parent=None, font=None):
        """显示信息对话框，居中显示在父窗口上"""
        if parent:
            # 创建自定义对话框
            dialog = ttkb.Toplevel(parent)
            # 先隐藏窗口，避免空白闪过
            dialog.withdraw()

            # 设置窗口图标
            icon_path = resource_path(os.path.join("icon", "icon.ico"))
            if os.path.exists(icon_path):
                dialog.iconbitmap(icon_path)

            dialog.title(title)
            dialog.geometry("300x150")
            dialog.resizable(False, False)
            
            # 设置对话框样式
            # 使用ttkbootstrap主题的背景色
            dialog.configure(bg=ttkb.Style().lookup('Toplevel', 'background'))
            
            # 使其成为模态窗口
            dialog.grab_set()
            
            # 确保父窗口尺寸已计算
            parent.update_idletasks()
            # 获取对话框尺寸
            dialog_width = 300
            dialog_height = 150
            # 计算居中位置
            parent_x = parent.winfo_x()
            parent_y = parent.winfo_y()
            parent_width = parent.winfo_width()
            parent_height = parent.winfo_height()
            
            # 如果父窗口位置为0,0或尺寸为0，使用默认偏移量(50,50)
            if (parent_x <= 0 and parent_y <= 0) or (parent_width <= 0 or parent_height <= 0):
                x = 50
                y = 50
            else:
                x = parent_x + (parent_width // 2) - (dialog_width // 2)
                y = parent_y + (parent_height // 2) - (dialog_height // 2)
            
            dialog.geometry(f"{dialog_width}x{dialog_height}+{x}+{y}")
            # 完成所有设置后显示窗口
            dialog.deiconify()

            # 添加消息标签
            # 使用传入的字体或默认字体
            msg_font = font if font else ("SimHei", 10)
            msg_label = ttkb.Label(dialog, text=message, padding=20, font=msg_font)
            msg_label.pack(expand=True)
            
            # 添加确定按钮 - 图片形式
            try:
                # 加载并调整图片大小
                img_path = resource_path(os.path.join("icon", "yes.png"))
                ok_img = Image.open(img_path)
                # 保持图片原始比例，调整宽度为80，高度自动计算
                width, height = ok_img.size
                new_width = 40
                new_height = int(height * new_width / width)
                ok_img = ok_img.resize((new_width, new_height), Image.Resampling.LANCZOS)
                ok_photo = ImageTk.PhotoImage(ok_img)
                
                # 使用Label作为按钮
                ok_btn = ttkb.Label(dialog, image=ok_photo, cursor="hand2")
                ok_btn.image = ok_photo  # 保持引用
                ok_btn.bind("<Button-1>", lambda e: dialog.destroy())
                ok_btn.pack(pady=10)
            except Exception as e:
                log_error(f"加载确认按钮图片失败: {str(e)}")
                # 图片加载失败时，使用文本按钮
                ok_btn = ttkb.Button(dialog, text="确定", command=dialog.destroy, bootstyle="primary")
                ok_btn.pack(pady=10)
            
            # 等待对话框关闭
            parent.wait_window(dialog)
        else:
            # 如果没有父窗口，使用默认消息框
            messagebox.showinfo(title, message)
    
    @staticmethod
    def showwarning(title, message, parent=None, font=None):
        """显示警告对话框，居中显示在父窗口上"""
        if parent:
            # 创建自定义对话框
            dialog = ttkb.Toplevel(parent)
            # 先隐藏窗口，避免空白闪过
            dialog.withdraw()

            # 设置窗口图标
            icon_path = resource_path(os.path.join("icon", "icon.ico"))
            if os.path.exists(icon_path):
                dialog.iconbitmap(icon_path)

            dialog.title(title)
            dialog.geometry("300x150")
            dialog.resizable(False, False)
            
            # 设置对话框样式
            # 使用ttkbootstrap主题的背景色
            dialog.configure(bg=ttkb.Style().lookup('Toplevel', 'background'))
            
            # 使其成为模态窗口
            dialog.grab_set()
            # 确保父窗口尺寸已计算
            parent.update_idletasks()
            # 获取对话框尺寸
            dialog_width = 300
            dialog_height = 150
            # 计算居中位置
            parent_x = parent.winfo_x()
            parent_y = parent.winfo_y()
            parent_width = parent.winfo_width()
            parent_height = parent.winfo_height()
            
            # 如果父窗口位置为0,0或尺寸为0，使用默认偏移量(50,50)
            if (parent_x <= 0 and parent_y <= 0) or (parent_width <= 0 or parent_height <= 0):
                x = 50
                y = 50
            else:
                x = parent_x + (parent_width // 2) - (dialog_width // 2)
                y = parent_y + (parent_height // 2) - (dialog_height // 2)
            
            dialog.geometry(f"{dialog_width}x{dialog_height}+{x}+{y}")
            # 完成所有设置后显示窗口
            dialog.deiconify()

            # 添加消息标签
            # 使用传入的字体或默认字体
            msg_font = font if font else ("SimHei", 10)
            msg_label = ttkb.Label(dialog, text=message, padding=20, font=msg_font)
            msg_label.pack(expand=True)
            
            # 添加确定按钮 - 图片形式
            try:
                # 加载并调整图片大小
                img_path = resource_path(os.path.join("icon", "yes.png"))
                ok_img = Image.open(img_path)
                # 保持图片原始比例，调整宽度为80，高度自动计算
                width, height = ok_img.size
                new_width = 40
                new_height = int(height * new_width / width)
                ok_img = ok_img.resize((new_width, new_height), Image.Resampling.LANCZOS)
                ok_photo = ImageTk.PhotoImage(ok_img)
                
                # 使用Label作为按钮
                ok_btn = ttkb.Label(dialog, image=ok_photo, cursor="hand2")
                ok_btn.image = ok_photo  # 保持引用
                ok_btn.bind("<Button-1>", lambda e: dialog.destroy())
                ok_btn.pack(pady=10)
            except Exception as e:
                log_error(f"加载警告对话框按钮图片失败: {str(e)}")
                # 图片加载失败时，使用文本按钮
                ok_btn = ttkb.Button(dialog, text="确定", command=dialog.destroy, bootstyle="warning")
                ok_btn.pack(pady=10)
            
            # 等待对话框关闭
            parent.wait_window(dialog)
        else:
            # 如果没有父窗口，使用默认消息框
            messagebox.showwarning(title, message)
    
    @staticmethod
    def showerror(title, message, parent=None, font=None):
        """显示错误对话框，居中显示在父窗口上"""
        if parent:
            # 创建自定义对话框
            dialog = ttkb.Toplevel(parent)
            # 先隐藏窗口，避免空白闪过
            dialog.withdraw()

            # 设置窗口图标
            icon_path = resource_path(os.path.join("icon", "icon.ico"))
            if os.path.exists(icon_path):
                dialog.iconbitmap(icon_path)

            dialog.title(title)
            dialog.geometry("300x150")
            dialog.resizable(False, False)
            
            # 设置对话框样式
            # 使用ttkbootstrap主题的背景色
            dialog.configure(bg=ttkb.Style().lookup('Toplevel', 'background'))
            
            # 使其成为模态窗口
            dialog.grab_set()
            # 确保父窗口尺寸已计算
            parent.update_idletasks()
            # 获取对话框尺寸
            dialog_width = 300
            dialog_height = 150
            # 计算居中位置
            parent_x = parent.winfo_x()
            parent_y = parent.winfo_y()
            parent_width = parent.winfo_width()
            parent_height = parent.winfo_height()
            
            # 如果父窗口位置为0,0或尺寸为0，使用默认偏移量(50,50)
            if (parent_x <= 0 and parent_y <= 0) or (parent_width <= 0 or parent_height <= 0):
                x = 50
                y = 50
            else:
                x = parent_x + (parent_width // 2) - (dialog_width // 2)
                y = parent_y + (parent_height // 2) - (dialog_height // 2)
            
            dialog.geometry(f"{dialog_width}x{dialog_height}+{x}+{y}")
            # 完成所有设置后显示窗口
            dialog.deiconify()

            # 添加消息标签
            # 使用传入的字体或默认字体
            msg_font = font if font else ("SimHei", 10)
            msg_label = ttkb.Label(dialog, text=message, padding=20, font=msg_font)
            msg_label.pack(expand=True)
            
            # 添加确定按钮 - 图片形式
            try:
                # 加载并调整图片大小
                img_path = resource_path(os.path.join("icon", "yes.png"))
                ok_img = Image.open(img_path)
                # 保持图片原始比例，调整宽度为80，高度自动计算
                width, height = ok_img.size
                new_width = 40
                new_height = int(height * new_width / width)
                ok_img = ok_img.resize((new_width, new_height), Image.Resampling.LANCZOS)
                ok_photo = ImageTk.PhotoImage(ok_img)
                
                # 使用Label作为按钮
                ok_btn = ttkb.Label(dialog, image=ok_photo, cursor="hand2")
                ok_btn.image = ok_photo  # 保持引用
                ok_btn.bind("<Button-1>", lambda e: dialog.destroy())
                ok_btn.pack(pady=10)
            except Exception as e:
                log_error(f"加载错误对话框按钮图片失败: {str(e)}")
                # 图片加载失败时，使用文本按钮
                ok_btn = ttkb.Button(dialog, text="确定", command=dialog.destroy, bootstyle="danger")
                ok_btn.pack(pady=10)
            
            # 等待对话框关闭
            parent.wait_window(dialog)
        else:
            # 如果没有父窗口，使用默认消息框
            messagebox.showerror(title, message)

    @staticmethod
    def askyesno(title, message, parent=None, font=None):
        """显示询问对话框，居中显示在父窗口上"""
        result = [False]
        
        if parent:
            # 创建自定义对话框
            dialog = ttkb.Toplevel(parent)
            # 先隐藏窗口，避免空白闪过
            dialog.withdraw()

            # 设置窗口图标
            icon_path = resource_path(os.path.join("icon", "icon.ico"))
            if os.path.exists(icon_path):
                dialog.iconbitmap(icon_path)

            dialog.title(title)
            dialog.geometry("300x150")
            dialog.resizable(False, False)
            
            # 设置对话框样式
            # 使用ttkbootstrap主题的背景色
            dialog.configure(bg=ttkb.Style().lookup('Toplevel', 'background'))
            
            # 使其成为模态窗口
            dialog.grab_set()
            # 确保父窗口尺寸已计算
            parent.update_idletasks()
            # 获取对话框尺寸
            dialog_width = 300
            dialog_height = 150
            # 计算居中位置
            parent_x = parent.winfo_x()
            parent_y = parent.winfo_y()
            parent_width = parent.winfo_width()
            parent_height = parent.winfo_height()
            
            # 如果父窗口位置为0,0或尺寸为0，使用默认偏移量(50,50)
            if (parent_x <= 0 and parent_y <= 0) or (parent_width <= 0 or parent_height <= 0):
                x = 50
                y = 50
            else:
                x = parent_x + (parent_width // 2) - (dialog_width // 2)
                y = parent_y + (parent_height // 2) - (dialog_height // 2)
            
            dialog.geometry(f"{dialog_width}x{dialog_height}+{x}+{y}")
            # 完成所有设置后显示窗口
            dialog.deiconify()

            # 添加消息标签
            # 使用传入的字体或默认字体
            msg_font = font if font else ("SimHei", 10)
            msg_label = ttkb.Label(dialog, text=message, padding=20, font=msg_font)
            msg_label.pack(expand=True)
            
            # 创建按钮框架
            btn_frame = ttkb.Frame(dialog)
            btn_frame.pack(pady=10)
            
            # 添加是按钮 - 图片形式
            try:
                log_debug("显示询问对话框: {} - {}".format(title, message))
                # 加载并调整图片大小
                yes_img_path = resource_path(os.path.join("icon", "yes.png"))
                yes_img = Image.open(yes_img_path)
                # 保持图片原始比例，调整宽度为80，高度自动计算
                width, height = yes_img.size
                new_width = 40
                new_height = int(height * new_width / width)
                yes_img = yes_img.resize((new_width, new_height), Image.Resampling.LANCZOS)
                yes_photo = ImageTk.PhotoImage(yes_img)
                
                # 使用Label作为按钮
                yes_btn = ttkb.Label(btn_frame, image=yes_photo, cursor="hand2")
                yes_btn.image = yes_photo  # 保持引用
                yes_btn.bind("<Button-1>", lambda e: [result.__setitem__(0, True), dialog.destroy()])
                yes_btn.pack(side=tk.LEFT, padx=10)
            except Exception as e:
                # 图片加载失败时，使用文本按钮
                yes_btn = ttkb.Button(btn_frame, text="是", command=lambda: [result.__setitem__(0, True), dialog.destroy()], bootstyle="success")
                yes_btn.pack(side=tk.LEFT, padx=10)
            
            # 添加否按钮 - 图片形式
            try:
                # 加载并调整图片大小
                no_img_path = resource_path(os.path.join("icon", "no.png"))
                no_img = Image.open(no_img_path)
                # 保持图片原始比例，调整宽度为80，高度自动计算
                width, height = no_img.size
                new_width = 40
                new_height = int(height * new_width / width)
                no_img = no_img.resize((new_width, new_height), Image.Resampling.LANCZOS)
                no_photo = ImageTk.PhotoImage(no_img)
                
                # 使用Label作为按钮
                no_btn = ttkb.Label(btn_frame, image=no_photo, cursor="hand2")
                no_btn.image = no_photo  # 保持引用
                no_btn.bind("<Button-1>", lambda e: [result.__setitem__(0, False), dialog.destroy()])
                no_btn.pack(side=tk.LEFT, padx=10)
            except Exception as e:
                # 图片加载失败时，使用文本按钮
                no_btn = ttkb.Button(btn_frame, text="否", command=lambda: [result.__setitem__(0, False), dialog.destroy()], bootstyle="danger")
                no_btn.pack(side=tk.LEFT, padx=10)
            
            # 等待对话框关闭
            parent.wait_window(dialog)
            return result[0]
        else:
            # 如果没有父窗口，使用默认消息框
            return messagebox.askyesno(title, message)